import { TagProps } from '@arco-design/web-react'

// 基础类型
export interface IBaseItem {
    // id
    id: string
    // 标题
    label: string
    // 类型标识
    type: 'root' | 'group' | 'api' | 'expect'
    // 父id
    parentId?: string
}

// 方法名
export type IMethod =
    | ''
    | 'GET'
    | 'POST'
    | 'PUT'
    | 'DELETE'
    | 'PATCH'
    | 'HEAD'
    | 'OPTIONS'

// 方法名 转 TAG颜色
export const methodToTagColor: {
    [key in IMethod]: TagProps['color']
} = {
    '': 'gray',
    GET: 'green',
    POST: 'blue',
    PUT: 'orange',
    DELETE: 'red',
    PATCH: 'purple',
    HEAD: 'gray',
    OPTIONS: 'gray',
} as const

// 请求处理hookId
export type IApiHandlerIds = 'reqHeaders' | 'reqBody' | 'resHeaders' | 'resBody'

// 请求处理器
export interface IApiHandler {
    // 启用
    enabled?: boolean
    // mock规则
    mockRule?: string
}

// 请求处理
export type IApiHandlers = {
    [key in IApiHandlerIds]?: IApiHandler
}

// 列表项
export type IListItem = IApiItem | IGroupItem

// 变量类型
export type IVariableType = 'string' | 'number' | 'boolean' | 'null'

// 变量项
export interface IVariableItem {
    // id
    id: string
    // 变量名
    name: string
    // 变量类型
    type?: IVariableType
    // mock规则
    mockRule?: string
    // 值
    value?: string | number | boolean | null
    // 使用mock规则
    useMock?: boolean
}

export type IVariableValueType = IVariableItem['value']

// 期望
export interface IExpectItem extends Omit<IBaseItem, 'parentId'> {
    type: 'expect'
    // 变量配置
    variables?: IVariableItem[]
    // 请求处理
    handlers?: IApiHandlers
}

export const enum ImportMode {
    mockResponseExportFile = 'mock-response-export-file',
    swaggerJsonUrl = 'swagger-json-url',
    yapiUrl = 'yapi-url',
    yapiPage = 'yapi-page',
}

// 导入数据，保存在api中
export interface IImportData {
    // 模式
    mode: ImportMode
    // 从swagger-json-url导入时会有以下属性
    url?: string
    // 请求地址
    path?: string
    // 请求方法
    method?: IMethod
    // swagger中的path项，从swaggerJson中导入时存在
    pathItem?: any
    // yapi接口项，从yapi导入时存在
    yapiItem?: any
}

// 接口定义
export interface IApiItem
    extends IBaseItem,
        Pick<IExpectItem, 'variables' | 'handlers'> {
    // 类型标识
    type: 'api'
    // 是否启用
    enabled?: boolean
    // 请求方法
    method?: IMethod
    // 匹配模式
    machMode?: 'includes' | 'equal' | 'regex'
    // 请求地址
    url?: string
    // 当前使用的期望
    expectId?: string | 'default'
    // 期望列表
    expects?: IExpectItem[]
    // 导入数据，可以根据导入数据同步数据
    importData?: IImportData
    // 默认期望
    // IExpectItem.variables, IExpectItem.handlers
}

// 分组定义
export interface IGroupItem extends IBaseItem {
    // 类型标识
    type: 'group'
    // 是否启用
    enabled?: boolean
    // 组内项目，只有在视图中使用，存储的时候不存children
    children?: IListItem[]
}

// 根分组
export const root: IGroupItem = {
    id: '1',
    label: '分组1',
    type: 'group',
    children: [
        {
            id: '1-1',
            label: '活动引擎',
            type: 'group',
            children: [
                {
                    id: '1-1-1',
                    label: '活动引擎',
                    type: 'api',
                    method: 'GET',
                    url: '/config',
                },
            ],
        },
        {
            id: '1-2',
            label: '投壶英雄',
            type: 'group',
            children: [
                {
                    id: '1-2-1',
                    label: '活动引擎',
                    type: 'api',
                },
                {
                    id: '1-2',
                    label: '文件夹',
                    type: 'group',
                    children: [
                        {
                            id: '1-2-1',
                            label: '内容1',
                            type: 'api',
                        },
                        {
                            id: '1-2-2',
                            label: '内容12',
                            type: 'api',
                        },
                    ],
                },
                {
                    id: '1-2-2',
                    label: '活动引擎2',
                    type: 'api',
                },
            ],
        },
        {
            id: '1-3',
            label: '投壶英雄',
            type: 'group',
            children: [
                {
                    id: '1-2-1',
                    label: '活动引擎',
                    type: 'api',
                },
                {
                    id: '1-2',
                    label: '文件夹',
                    type: 'group',
                    children: [
                        {
                            id: '1-2-1',
                            label: '内容1',
                            type: 'api',
                        },
                        {
                            id: '1-2-2',
                            label: '内容12',
                            type: 'api',
                        },
                    ],
                },
                {
                    id: '1-2-2',
                    label: '活动引擎2',
                    type: 'api',
                },
            ],
        },
    ],
}
